package entidades;

import java.util.ArrayList;
import java.util.Date;
import java.util.GregorianCalendar;
import java.text.SimpleDateFormat;

import util.GCOBUtil;

public class Chamadas {

	private String codigoRegistro = "1";// 2
	private String codigoNatureza = "111";
	private String codigoEOTFilialPrestadoraOrigem = "999";
	private String codigoEOTFilialPrestadoraDestino = "411";
	private String assinanteA = "1199999999           ";// 21 caracters
	private String cnlOrigem = "00000";
	private String csp = "11";
	private String codigoPais = "000";
	private String assinanteB = "1199999999           ";// 21 caracters
	private String cnlDestino = "00000";
	private String dataChamada = GCOBUtil.data("ddMMyyyy");
	private String horaChamada = GCOBUtil.data("Hmmss");
	private String duracaoReal = "000100";// "HHMMSS";
	private String duracaoTarifada = "00010";// MMMMS
	private String grupoHorario = "1";
	private String degrau = "01";
	private String codigoNacionalAreaVisitante = "00";
	private String valor = "22222.11111";
	private String codigoRefaturamento = "  ";// 02 caracteres RC, RD, RR
	private String identificadorRegistroLote = "0000001";
	private String filler = "                        ";// 24
	private int qtdChamadas = 10;
	private int incrementarMin = 1;
	private int tipoChamada = 1;
	private ArrayList<Chamadas> chamadas = new ArrayList<Chamadas>();
	private int valorTotal = 0;

	StringBuffer retorno = new StringBuffer();

	// ------------------- CONSTRUTOR
	public Chamadas() {
	}

	// ---------------- Metodos
	public StringBuffer getLinhas() {
		return retorno;
	}

	public ArrayList<Chamadas> gerachamadas() {
		int mim = getIncrementarMin();

		for (int i = 0; i < qtdChamadas; i++) {
			setIdentificadorRegistroLote(String.valueOf(i + 1));
			valorTotal = valorTotal + Integer.parseInt(valor);

			// Array
			Chamadas linhaChamada = new Chamadas();
			//---------------------------------------------------
			//R1 - Regras de Chamada internacional
			if (getCodigoPais().equals("   ") || getCodigoPais().equals("  ") || getCodigoPais().equals(" ") || getCodigoPais().equals("")) {
				linhaChamada.setCodigoRegistro("1");
				linhaChamada.setCnlDestino(getCnlDestino());
			}else{
				linhaChamada.setCodigoRegistro("2");
				linhaChamada.setCnlDestino("0");
			}
			linhaChamada.setCodigoPais(getCodigoPais());
			
			//R2 - 
			if(getAssinanteA().substring(0, 2) != getCnlOrigem().substring(0, 2)){
				linhaChamada.setCodigoNacionalAreaVisitante(getCnlOrigem().substring(0, 2));
			}else{
				linhaChamada.setCodigoNacionalAreaVisitante("00");
			}
			//R3 BASE DADOS se for Fixo ou Movel regra para o EOT da Intelig
						
			//---------------------------------------------------
			linhaChamada.setQtdChamadas(getQtdChamadas());
			linhaChamada.setCodigoNatureza(getCodigoNatureza());
			linhaChamada
					.setCodigoEOTFilialPrestadoraOrigem(getCodigoEOTFilialPrestadoraOrigem());
			linhaChamada
					.setCodigoEOTFilialPrestadoraDestino(getCodigoEOTFilialPrestadoraDestino());
			linhaChamada.setAssinanteA(getAssinanteA());// 21 caracters
			linhaChamada.setCnlOrigem(getCnlOrigem());
			linhaChamada.setCsp(getCsp());
			
			linhaChamada.setAssinanteB(getAssinanteB());// 21 caracters
			
			linhaChamada.setDataChamada(dataInicioChamada(getDataChamada(), mim));
			linhaChamada.setHoraChamada(getHoraChamada());
			linhaChamada.setDuracaoReal(getDuracaoReal());
			linhaChamada.setDuracaoTarifada(getDuracaoTarifada());
			linhaChamada.setGrupoHorario(getGrupoHorario());
			linhaChamada.setDegrau(getDegrau());
			
			linhaChamada.setValor(getValor());
			linhaChamada.setCodigoRefaturamento(getCodigoRefaturamento());// 02
			linhaChamada.setIdentificadorRegistroLote(String.valueOf(i + 1));

			// linha
			if (getTipoChamada() == 1) {

				retorno.append(linhaChamada.getCodigoRegistro()
						+ linhaChamada.getCodigoNatureza()
						//trocano a posicao defido na chamada a operadora inicial e a tim
						+ linhaChamada.getCodigoEOTFilialPrestadoraDestino()
						+ linhaChamada.getCodigoEOTFilialPrestadoraOrigem()
						
						+ linhaChamada.getAssinanteA()
						+ linhaChamada.getCnlOrigem() + linhaChamada.getCsp()
						+ linhaChamada.getCodigoPais()
						+ linhaChamada.getAssinanteB()
						+ linhaChamada.getCnlDestino()
						+ linhaChamada.getDataChamada()
						+ linhaChamada.getHoraChamada()
						+ linhaChamada.getDuracaoReal()
						+ linhaChamada.getDuracaoTarifada()
						+ linhaChamada.getGrupoHorario()
						+ linhaChamada.getDegrau()
						+ linhaChamada.getCodigoNacionalAreaVisitante()
						+ linhaChamada.getValor()
						+ linhaChamada.getCodigoRefaturamento()
						+ linhaChamada.getIdentificadorRegistroLote()
						+ linhaChamada.getFiller());
			} else if (getTipoChamada() == 2) {
				System.out.println("TP2");
			}
			retorno.append("\n");
			chamadas.add(linhaChamada);

			mim += getIncrementarMin();
		}

		return chamadas;
	}

	// ---------------- Metodos

	public String dataInicioChamada(String dataChamada, int minutos) {

		int dia = Integer.parseInt(dataChamada.substring(0, 2));
		int mes = Integer.parseInt(dataChamada.substring(2, 4)) - 1;
		int ano = Integer.parseInt(dataChamada.substring(4, 8)) - 1900;

		GregorianCalendar gc = new GregorianCalendar();
		gc.setTime(new Date(ano, mes, dia, 0, 0, 00));

		SimpleDateFormat sdf = new SimpleDateFormat("ddMMyyyyHmmss");
		// System.out.println(sdf.format(gc.getTime()));

		gc.add(java.util.Calendar.MINUTE, minutos);
		// System.out.println(sdf.format(gc.getTime()));
		String data = sdf.format(gc.getTime()).substring(0, 8);
		String hora = sdf.format(gc.getTime()).substring(8,
				sdf.format(gc.getTime()).length());

		setHoraChamada(GCOBUtil.alinharDireita(hora, "0", 6));
		return data;
	}

	// ---------------- Metodos Auxiliar
	public int getQtdChamadas() {
		return qtdChamadas;
	}

	public void setQtdChamadas(int qtdChamadas) {
		this.qtdChamadas = qtdChamadas;
	}

	public String getCodigoRegistro() {
		return codigoRegistro;
	}

	public void setCodigoRegistro(String codigoRegistro) {
		this.codigoRegistro = codigoRegistro;
	}

	public String getCodigoNatureza() {
		return codigoNatureza;
	}

	public void setCodigoNatureza(String codigoNatureza) {
		this.codigoNatureza = codigoNatureza;
	}

	public String getCodigoEOTFilialPrestadoraOrigem() {
		return codigoEOTFilialPrestadoraOrigem;
	}

	public void setCodigoEOTFilialPrestadoraOrigem(
			String codigoEOTFilialPrestadoraOrigem) {
		this.codigoEOTFilialPrestadoraOrigem = codigoEOTFilialPrestadoraOrigem;
	}

	public String getCodigoEOTFilialPrestadoraDestino() {
		return codigoEOTFilialPrestadoraDestino;
	}

	public void setCodigoEOTFilialPrestadoraDestino(
			String codigoEOTFilialPrestadoraDestino) {
		this.codigoEOTFilialPrestadoraDestino = codigoEOTFilialPrestadoraDestino;
	}

	public String getAssinanteA() {
		return assinanteA;
	}

	public void setAssinanteA(String assinanteA) {
		this.assinanteA = GCOBUtil.alinharEsquerda(assinanteA, " ", 21);
	}

	public String getCnlOrigem() {
		return cnlOrigem;
	}

	public void setCnlOrigem(String cnlOrigem) {
		this.cnlOrigem = GCOBUtil.alinharDireita(cnlOrigem, "0", 5);
	}

	public String getCsp() {
		return csp;
	}

	public void setCsp(String csp) {
		this.csp = csp;
	}

	public String getCodigoPais() {
		return codigoPais;
	}

	public void setCodigoPais(String codigoPais) {
		this.codigoPais = GCOBUtil.alinharEsquerda(codigoPais, " ", 3);
	}

	public String getAssinanteB() {
		return assinanteB;
	}

	public void setAssinanteB(String assinanteB) {
		this.assinanteB = GCOBUtil.alinharEsquerda(assinanteB, " ", 21);
	}

	public String getCnlDestino() {
		return cnlDestino;
	}

	public void setCnlDestino(String cnlDestino) {
		this.cnlDestino = GCOBUtil.alinharDireita(cnlDestino, "0", 5);
	}

	public String getDataChamada() {
		return dataChamada;
	}

	public void setDataChamada(String dataChamada) {
		this.dataChamada = dataChamada;
	}

	public String getHoraChamada() {
		return horaChamada;
	}

	public void setHoraChamada(String horaChamada) {
		this.horaChamada = GCOBUtil.alinharDireita(horaChamada, "0", 6);
	}

	public String getDuracaoReal() {
		return duracaoReal;
	}

	public void setDuracaoReal(String duracaoReal) {
		this.duracaoReal = duracaoReal;
	}

	public String getDuracaoTarifada() {
		return duracaoTarifada;
	}

	public void setDuracaoTarifada(String duracaoTarifada) {
		this.duracaoTarifada = duracaoTarifada;
	}

	public String getGrupoHorario() {
		return grupoHorario;
	}

	public void setGrupoHorario(String grupoHorario) {
		this.grupoHorario = grupoHorario;
	}

	public String getDegrau() {
		return degrau;
	}

	public void setDegrau(String degrau) {
		this.degrau = degrau;
	}

	public String getCodigoNacionalAreaVisitante() {
		return codigoNacionalAreaVisitante;
	}

	public void setCodigoNacionalAreaVisitante(
			String codigoNacionalAreaVisitante) {
		this.codigoNacionalAreaVisitante = codigoNacionalAreaVisitante;
	}

	public String getValor() {
		return valor;
	}

	public void setValor(String valor) {
		// *******************
		this.valor = GCOBUtil.alinharDireita(valor, "0", 10);
		;
	}

	public void setValor(double valor) {
		this.valor = GCOBUtil.alinharDireita(GCOBUtil
				.converterDoubleString(valor), "0", 10);
	}

	public String getCodigoRefaturamento() {
		return codigoRefaturamento;
	}

	public void setCodigoRefaturamento(String codigoRefaturamento) {
		this.codigoRefaturamento = codigoRefaturamento;
	}

	public String getIdentificadorRegistroLote() {
		return identificadorRegistroLote;
	}

	public void setIdentificadorRegistroLote(String identificadorRegistroLote) {
		this.identificadorRegistroLote = GCOBUtil.alinharDireita(
				identificadorRegistroLote, "0", 7);
	}

	public String getFiller() {
		return filler;
	}

	public void setFiller(String filler) {
		this.filler = filler;
	}

	public int getValorTotal() {
		return this.valorTotal;
	}

	public int getIncrementarMin() {
		return incrementarMin;
	}

	public void setIncrementarMin(int incrementarMin) {
		this.incrementarMin = incrementarMin;
	}

	public int getTipoChamada() {
		return tipoChamada;
	}

	public void setTipoChamada(int tipoChamada) {
		this.tipoChamada = tipoChamada;
	}
}
